我在try catch块中有这种奇怪的行为。当我在其中初始化变量时,它们似乎超出了以下代码的范围,即使我在外面声明它们。
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopyFile {
public static void main(String[] args) {
FileInputStream fis;
FileOutputStream fos;
args[0] = "somefile.txt";
args[1] = "copyithere.txt";
int i;
try {
try {
fis = new FileInputStream(args[0]);
} catch (FileNotFoundException e) {
System.out.println("Input file not found");
e.getMessage();
}
try {
fos = new FileOutputStream(args[1]);
} catch (FileNotFoundException e) {
System.out.println("Output file not found");
e.printStackTrace();
}
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Give input and output file name");
e.getStackTrace();
}
try {
do {
i = fis.read();
fos.write(i);
} while (i != -1);
} catch (IOException e) {
System.out.println("Some IO exception");
e.getMessage();
}
}
}
奇怪的是当我将变量声明为null“FileInputStream fis = null;然后它全部转好......是没有初始化的声明等同于初始化为null ..? 摆脱“超出范围错误”的另一种方式是当我把“返回”时在catch块的末尾..代码不应该运行正常吗?我可以看到这可能会出现错误,但是这与fis和fio的“超出范围错误”有何关联?
答案 0 :(得分:1)
没有初始化等同于初始化的isn&t; t声明 为null ..?
不是局部变量的情况。创建实例时,只会初始化实例变量。
摆脱范围错误的另一种方式"#34;是我放的时候 "返回;"
您应该使用Java 7中引入的try with resources
块。它将自动关闭流,例如:
int i;
try(FileInputStream fis = new FileInputStream(args[0]);
FileOutputStream fos = new FileOutputStream(args[1]);){
do {
i = fis.read();
fos.write(i);
} while (i != -1);
}
答案 1 :(得分:0)
没有初始化等同于初始化的isn&t; t声明 为空?
本地变量只需要由程序员初始化,因为在创建对象时,JVM会使用默认值(基于类型)初始化类的实例变量。
摆脱范围错误的另一种方式"#34;是我放的时候 "返回;"在catch块的末尾..不应该运行代码 好了吗?
这里有两种可能性:
(1)绿色路径方案:如果第一个FileNotFoundException
块中没有try
,则fis
变量已成功初始化,因此不会有任何错误。
(2)红色路径方案:fis
将不会在第一个FileNotFoundException
块中的try
上初始化,因此如果您{{1}从第一个return
块本身开始,在最后catch
块中不需要fis
变量(因为这些行永远不会被执行,因为你从中间返回),所以没有初始化错误。
当我从方法中取出声明并使它们静止时 也有效..你知道这种区别的原因是什么?
try
变量将由JVM用默认值(如实例变量)初始化,因此如果将它们标记为static
(JVM已经初始化它们),则不会有任何变量初始化错误