当前位置: 首页 > 知识库问答 >
问题:

为什么,当我在方法index1=路径中时。indexOf(jdk);我将字符串变量传递给jdk,编译器抛出异常

刘狐若
2023-03-14

为什么,当我在方法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);
    }
}

共有2个答案

慕容玉堂
2023-03-14

我按发布的方式试用了您的代码。它编译良好(没有编译时错误),但在我运行它时确实抛出了这个:

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”时,为什么它工作正常?

在这种情况下它可以正常工作,因为您使用的是硬编码值-

轩辕华辉
2023-03-14

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检