Java 从方法返回对象

Java 从方法返回对象,java,Java,我定义了一个名为“findRegion()”的方法,返回类型为“Screen”。即使在方法的末尾返回了一个“Screen”对象,EclipseIDE仍然会显示一个关于返回类型不匹配的错误。方法如下: public Screen findRegion(){ try{ Screen screen = new Screen(); int x = screen.find("C:\\Users\\skhan\\Desktop\\Images\

我定义了一个名为“findRegion()”的方法,返回类型为“Screen”。即使在方法的末尾返回了一个“Screen”对象,EclipseIDE仍然会显示一个关于返回类型不匹配的错误。方法如下:

public Screen findRegion(){
        try{
            Screen screen = new Screen();
            int x = screen.find("C:\\Users\\skhan\\Desktop\\Images\\VVX500\\Capture2.PNG").getX() - 10; 
            int y = screen.find("C:\\Users\\skhan\\Desktop\\Images\\VVX500\\Capture2.PNG").getY() - 10; 
            int w = x + 370;
            int h = y + 300;
            screen.setRect(x,y,w,h);
            return screen;
        }
        catch(FindFailed e){
            e.printStackTrace();
        }

    }
此代码的目标是创建具有相应尺寸的区域。 请指出我代码中的错误。
谢谢

由于您的try-catch块而发生错误。如果发生错误(
FindFailed
),该怎么办?那你就什么都不退了

try {
  Screen screen = new Screen();
  int x = screen.find("C:\\Users\\skhan\\Desktop\\Images\\VVX500\\Capture2.PNG").getX() - 10; 
  int y = screen.find("C:\\Users\\skhan\\Desktop\\Images\\VVX500\\Capture2.PNG").getY() - 10; 
  int w = x + 370;
  int h = y + 300;
  screen.setRect(x,y,w,h);
  return screen;
} catch (FindFailed e) {
  e.printStackTrace();
  // what to do if this happens?
  // proper error handling must be done here. Either return 'null' or propagate the error to the calling method!
}
// you can even make a return statement here if it is more convenient for you

您的方法必须具有默认的返回语句

(参见返回语句的注释)

最佳实践是该方法只有一个返回语句。然后你的代码变成了

public String findRegion(){
        Screen screen= null;
        try{
            screen = new Screen();
            int x = screen.find("C:\\Users\\skhan\\Desktop\\Images\\VVX500\\Capture2.PNG").getX() - 10; 
            int y = screen.find("C:\\Users\\skhan\\Desktop\\Images\\VVX500\\Capture2.PNG").getY() - 10; 
            int w = x + 370;
            int h = y + 300;
            screen.setRect(x,y,w,h);
        }
        catch(FindFailed e){
            e.printStackTrace();
        }
        return screen;

    }

在try块之前声明屏幕对象(您可以在catch中初始化它),并在catch块之后返回它。

如果您正在捕获异常,那么您也需要从那里返回一些内容。或者你也可以像下面这样

public Screen findRegion(){
    Screen screen = null;
    try{
        screen = new Screen();
        int x = screen.find("C:\\Users\\skhan\\Desktop\\Images\\VVX500\\Capture2.PNG").getX() - 10; 
        int y = screen.find("C:\\Users\\skhan\\Desktop\\Images\\VVX500\\Capture2.PNG").getY() - 10; 
        int w = x + 370;
        int h = y + 300;
        screen.setRect(x,y,w,h);

    }
    catch(FindFailed e){
        e.printStackTrace();
    }
    return screen;

}

由于如果发生
FindFailed
异常,则不会返回任何内容,因此eclipse显示
返回类型不匹配

您应该执行以下类型的代码:

public Screen findRegion(){
    Screen screen = null; //initialize your variable here with null
    try{
        screen = new Screen();
        int x = screen.find("C:\\Users\\skhan\\Desktop\\Images\\VVX500\\Capture2.PNG").getX() - 10; 
        int y = screen.find("C:\\Users\\skhan\\Desktop\\Images\\VVX500\\Capture2.PNG").getY() - 10; 
        int w = x + 370;
        int h = y + 300;
        screen.setRect(x,y,w,h);
    }
    catch(FindFailed e){
        e.printStackTrace();
    }
    return screen; //return screen object if all goes well or null if any exception occurs.
}
注意:看起来
FindFailed
是您的自定义
异常
,您应该编写以异常结尾的自定义异常类名(它减少了混淆,看起来像异常)


如果出现错误,函数将跳过try块“return语句”,并且不会返回任何内容。我相信这就是问题所在。关键是在方法的一条路径的末尾,返回一个
屏幕
对象。如果您的代码抛出异常,那么将返回什么?如果出现异常,您不会返回任何内容。如果抛出异常,将不会返回任何内容,因为return语句位于try块中。“Eventhough在我的方法末尾,我返回一个“Screen”对象”这根本不正确。@user3796719-重要的问题是。。。你明白为什么吗?
public Screen findRegion(){
    Screen screen = null; //initialize your variable here with null
    try{
        screen = new Screen();
        int x = screen.find("C:\\Users\\skhan\\Desktop\\Images\\VVX500\\Capture2.PNG").getX() - 10; 
        int y = screen.find("C:\\Users\\skhan\\Desktop\\Images\\VVX500\\Capture2.PNG").getY() - 10; 
        int w = x + 370;
        int h = y + 300;
        screen.setRect(x,y,w,h);
    }
    catch(FindFailed e){
        e.printStackTrace();
    }
    return screen; //return screen object if all goes well or null if any exception occurs.
}