为什么,当我在方法index1=path.indexOf(jdk);
我传递一个字符串变量给jdk
,编译器抛出异常,当我把"jdk"
放在引号中一切正常(index1=path.indexOf("jdk");)
。这个变量已经有一个字符串类型,为什么要引用它,这个变量已经引用了一个字符串类型对象
public class Solution {
public static void main(String[] args) {
String path = "/usr/java/jdk1.8/bin/";
String jdk13 = "jdk-13";
System.out.println(changePath(path, jdk13));
}
public static String changePath(String path, String jdk) {
//System.out.println(jdk);
int index1=path.indexOf(jdk);
int index2=path.indexOf("/",index1);
String oldjdk=path.substring(index1,index2);
return path.replace(oldjdk,jdk);
}
}
我按发布的方式试用了您的代码。它编译良好(没有编译时错误),但在我运行它时确实抛出了这个:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: begin -1, end 0, length 21
该错误来自此行,显然索引的值为“-1”:
String oldjdk=path.substring(index1,index2);
让我们通过添加以下内容来确认:
System.out.println("index1: " + index1);
果然是“-1”:
index1: -1
为什么它以“-1”结束?值index1
从这一行设置:int index1=path.indexOf(jdk)
-
int index1 = path.indexOf(jdk);
System.out.println("path: " + path);
System.out.println("jdk: " + jdk);
System.out.println("index1: " + index1);
这是新的输出,它清楚地显示了jdk的值,即“jdk-13”,在路径值的任何地方都不会显示为子字符串。如果我们查看Javadoc中的substring(),我们会发现如果在字符串中找不到值,那么该方法将返回-1。
path: /usr/java/jdk1.8/bin/
jdk: jdk-13
index1: -1
您的原始问题:
为什么在使用变量jdk时会抛出错误?
它抛出一个错误,因为您试图替换一个不存在的子字符串,但您的代码没有对此进行检查(请记住,它确实给您一个“-1”返回值,您可以在代码中继续之前进行检查)。
作为一个小的补充,您可以在调用substring()
之前添加一个保护,这不会完全修复程序,但它会防止它因异常而爆炸:
if (index1 >= 0) {
oldjdk = path.substring(index1, index2);
return path.replace(oldjdk, jdk);
} else {
System.out.println("index1 is a non-positive number: " + index1);
return path; // since modification didn't work, return the original path
}
当您使用硬编码值“jdk”时,为什么它工作正常?
在这种情况下它可以正常工作,因为您使用的是硬编码值-
是substring(index1, index2)
抛出了IndexOutOfBoundsException
(准确地说是StringIndexOutOfBoundsException
)。
索引1是负数,因为字符串“jdk-13”不包含在路径中(而路径中确实包含您在工作时尝试显式传递的字符串“jdk”),所以索引f返回-1(因为它没有找到子字符串),并且子字符串不期望有负数作为其第一个参数。
换言之,请阅读索引of和子字符串的文档。这里解释了所有这些问题。
顺便说一句,这不是编译器的错误,而是运行时异常。你最好尽早了解其中的差别。
在index.hpp中,我创建了一个具有多个数据成员的类,如、等。我在类外部定义了一个构造函数。在program.cpp中,我创建了一个名为SAM的对象。当我试图编译它时,它显示错误。什么原因? Program.cpp index.hpp 错误信息
答案可能存在于某个地方,但我找不到。我从我正在创建的一个算法中得出这个问题。实质上是,如果s1包含s2,则返回true,忽略希腊语/英语字符差异。例如,字符串“nai,of course”包含字符串“vaxi”。不过,这与我的问题无关。
问题内容: 为什么经常被称为 代替 ? W3,MDN和MSDN都声明它是可选的。此外,ActiveX控件似乎不需要参数: 这种做法至少可以追溯到2005年的Google Maps中 ,但被缩小了,没有任何解释: 问题答案: 如果您看一下XMLHttpRequest的旧规范,似乎W3C似乎并不需要在某一点上将该参数设为可选,这可能导致人们提供了一个明确的null值,以防万一。 (搜索“应支持发送”)
反应路由路径不工作 它在所有URL中仅显示产品组件 我已经灌输了react路由器dom,还导入了BrowserRouter作为路由器、交换机、路由、链路 到底是什么问题?我想不出来。
问题内容: 假设我将Sun的JVM嵌入C ++应用程序中。通过JNI,我调用了Java方法(我自己的),该方法又调用了我在共享库中实现的本机方法。 如果此本机方法抛出C ++异常,会发生什么? 编辑:编译器是gcc 3.4.x,jvm是sun的1.6.20。 问题答案: 在JNI文献中,“ 异常 ”一词似乎专门用于指代Java异常。本机代码中发生的意外事件称为 编程错误 。JNI明确不需要JVM检