尝试将catch块变量超出范围

时间:2017-03-27 22:04:48

标签: java scope null return try-catch

我在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的“超出范围错误”有何关联?

2 个答案:

答案 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已经初始化它们),则不会有任何变量初始化错误