在这个例子中,与Java的返回类型有什么关系

时间:2014-08-12 15:22:35

标签: java

我不断获得method must return result of type byte[]

public class MyClass {

  public static byte[] someMethod() {
    try {
        ...
        byte[] someByte = .... ;            
        return someByte;
    } catch (Exception e) {
        e.printStackTrace();
    } 
    return someByte;
   }    
}

如果有try/catch阻止,我怎样才能正确返回?

7 个答案:

答案 0 :(得分:4)

这将无法编译,因为someByte在try块中声明并在其外部访问。

应该是:

public class MyClass {
  public static byte[] someMethod() {
    byte[] someByte = null;
    try {
        ...
        someByte = .... ;            
        return someByte;
    } catch (Exception e) {
        e.printStackTrace();
    } 
    return someByte;
  }    
}

答案 1 :(得分:4)

要正确返回某些内容,必须在try{}范围之外声明,并在其中初始化(如果这需要您包含try{})。例如: -

public class MyClass {

  public static byte[] someMethod() {
    byte[] someByte =null;
       try {
        ...
        someByte = .... ;
    } catch (Exception e) {
        e.printStackTrace();
    } 
    return someByte;
   }    
}

答案 2 :(得分:2)

您的数组someByte超出范围

public class MyClass {

  public static byte[] someMethod() {
    try {
        ...
        byte[] someByte = .... ;            // scope begins        
        return someByte;                    // scope ends
    } catch (Exception e) {
        e.printStackTrace();
    } 
    return someByte;                        // out of scope
   }    
}

而不是这样做

public class MyClass {

  public static byte[] someMethod() {
    byte[] someByte = null ;         // scope begins
    try {          
        someByte = .... ;         
        return someByte;
    } catch (Exception e) {
        e.printStackTrace();
    } 
    return someByte;                // scope ends
   }    
}

答案 3 :(得分:1)

在try / catch块的范围之外声明someByte,以便它在方法的更广泛范围内可见

byte[] someByte = null;
try {
    someByte = .... ;            
} catch (Exception e) {
    e.printStackTrace();
} 
return someByte;

答案 4 :(得分:1)

byte[] someByte移到try块

之外
public class MyClass {

      public static byte[] someMethod() {
        byte[] someByte = .... ;
        try {
            ...
            byte[] someByte = .... ;            
            return someByte;
        } catch (Exception e) {
            e.printStackTrace();
        } 
        return someByte;
       }    
    }

答案 5 :(得分:0)

图片中出现了 SCOPE OF VARIABLE ,变量的范围基本上是代码区域或代码中可以使用相同值访问变量的行数。

所以在这里你在try块中声明somebyte []并且变量的范围只在花括号内部,并且它只在该块中可见,因为你在块中声明它,所以当你试图得到的值时变量超出块将无法获得预期的结果。

       try {
    ...
    byte[] someByte = .... ;            
    return someByte;
    } catch (Exception e) {
    e.printStackTrace();
     } 

所以在块之外声明它,这样变量对于你可以访问它的那行代码是可见的。

你在块中声明它,因此它的生命周期和范围也在块内。

答案 6 :(得分:0)

正如其他人所说,必须在try / catch块之外声明someByte。但是,解释原因可能很有用。

try / catch块的try部分是在正常操作期间执行的,没有抛出异常。如果在执行try块期间抛出异常,则执行将立即停止。从那里开始,执行将在相应的catch块中继续(如果找到合适的catch块)。简而言之,就好像简单地删除了未使用的代码,来自catch块的代码替换了它。

编译器会检查可能由自身修改代码引起的问题。虽然在您的示例中,可能没有someByte未被声明的可能性,但编译器无法确定它不会。它无法预测是否会在

之前抛出异常
byte[] someByte = .... ;

正在考虑这种可能性:

public class MyClass {

  public static byte[] someMethod() {
        ...    // Exception thrown somewhere here
        byte[] someByte = .... ;            
        return someByte;
    } catch (Exception e) {
        e.printStackTrace();
    } 
    return someByte;
   }    
}

这意味着,基本上,JVM的作用是:

public class MyClass {

  public static byte[] someMethod() {
        ...    // Exception thrown somewhere here
        e.printStackTrace();
        return someByte;
  }    
}

如果您只是将其输入到源文件中,您会看到明显的问题,即返回一个根本不存在的变量。

通过在try块之外声明变量,您100%确定将使用正确的数据类型声明变量,因此您和编译器知道某些内容返回,即使它只是变量的默认值。如果愿意,您仍然可以在try / catch块中更改变量的值。