为什么java编译报错 每次运行java项目都会出现此报错的原因是什么
本篇文章给大家谈谈为什么java编译报错,以及每次运行java项目都会出现此报错的原因是什么对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。
java问题:为什么报错
1.为什么会报错?
分析:
方法:JDK源码调试。由于JDK源码的局部变量不好跟踪,我采用把源码复制过来进行跟踪的方式。
看报错信息:
java.lang.StringIndexOutOfBoundsException: String index out of range: 2
at java.lang.String.charAt(String.java:686)
at java.util.regex.Matcher.appendReplacement(Matcher.java:703)
at java.util.regex.Matcher.replaceFirst(Matcher.java:861)
at java.lang.String.replaceFirst(String.java:2146)
at test.Test.main(Test.java:11)
主要是在charAt这里出的数组越界错误。
而是由appendReplacement这里调用charAt引起的。
下面分析appendReplacement源码:
去掉一些
与出错无关的代码,简体下此源码。如下:
public static void appendReplacement(StringBuffer sb, String replacement){
int cursor= 0;
StringBuffer result= new StringBuffer();
while(cursor< replacement.length()){
char nextChar= replacement.charAt(cursor);
if(nextChar=='\\'){
cursor++;
nextChar= replacement.charAt(cursor);
result.append(nextChar);
cursor++;
} else{
result.append(nextChar);
cursor++;
}
}
}
这里的sb为(new StringBuffer("\\"),replacement为D:\\Program Files\\Apache Software Foundation\\Tomcat 5.5\\webapps\\MMS\\Resource\\
replacement太长,我简化的e\\
下面看:
他会把字符串的每个字符截取e,\
第一个e没问题
第二个\时进入
if(nextChar=='\\'){
cursor++;//为2了
nextChar= replacement.charAt(cursor);//相当于e\.charAt(2),当然出错,所以此时应该考虑把\\换为\\\\
result.append(nextChar);
cursor++;
}
D:\\Program Files\\Apache Software Foundation\\Tomcat 5.5\\webapps\\MMS\\Resource\\\\这样就不出错了
2.如果去掉最后的反斜线倒是不报错了,可是为什么用于替换的字符串被改变了?
解决方法见上
Java程序编译通过,为什么运行有误
java讲究的是一次编译处处运行,也就是提高了程序的一致性。java的程序之所在不同的操作系统上的运行结果是一样的,是因为java虚拟机。
所以要运行java都要装一个叫jdk的东西,里面有java的虚拟机。这个虚拟机就是来解释我们写的代码。通过这个虚拟机,就实现了代码的移植。
我们写好的程序,通过虚拟机,编译成class文件,然后在运行。但是我们只需要编译一次即可。
每次运行java项目都会出现此报错的原因是什么
【主回答】
运行时因为你使用的是工具,应该是你这个工具里面同时包含了多个不同的工程项目,这并不表示是你当前这个工程代码有错,可以将其从工程列表中先暂时关闭,而可能是其它工程存在问题。
检查下你其它工程是否有错,如果其它工程暂时不用,如果不需要再提醒,将上面的“始终运行而不询问”勾上即可。
java 中写出的类为什么编译不报错但是不能运行,代码没错啊
//看楼主问为什么能编译但不能运行,说明楼主应该是Java的初学者吧,Java程序其实编译和运行是两回事,没有必然联系的。刚才你的问题,在下面有注释的,这样就可以运行了,记得把类修改为test.java哦。运行下面
import java.util.*;
//这里不能用car,重新起一个名字,因为和下面的class Car冲突了。
public class test{
private static Scanner input;
public static void main(String args[]){
input= new Scanner(System.in);
System.out.println("请输入车主姓名,车速,方向盘角度");
Car car=new Car(input.next(),input.nextFloat(),input.nextFloat());
System.out.println("车主姓名为:"+car.getOwnerName());
System.out.println("当前车速为:"+car.getCurSpeed());
System.out.println("当前方向盘角度为:"+car.getCurDirInDegree());
System.out.println("修改车速");
System.out.println("新的车速为:");
car.changeSpeed(input.nextFloat());
System.out.println("在调用changeSpeed(80)后,车速为"+car.getCurSpeed());
car.stop();
System.out.println("在调用stop()后,车速为"+car.getCurSpeed());
}
}
class Car{
private String ownerName;//车主姓名
private float curSpeed;//当前车速
private float curDirInDegree;//当前方向盘转向角度
public Car(String ownerName){
this.ownerName=ownerName;
}
public Car(String ownerName, float speed, float dirInDegree){
this(ownerName);
curSpeed=speed;
curDirInDegree=dirInDegree;
}
public String getOwnerName(){//提供对车主姓名的访问
return ownerName;
}
public float getCurDirInDegree(){//提供对当前方向盘转向角度的访问
return curDirInDegree;
}
public float getCurSpeed(){//提供对当前车速的访问
return curSpeed;
}
public void changeSpeed(float curSpeed){//提供改变当前的车速
this.curSpeed=curSpeed;
}
public void stop(){//提供停车
curSpeed= 0;
}
}
END,本文到此结束,如果可以帮助到大家,还望关注本站哦!