如何在int方法中不返回值?

hlswsv35  于 2021-07-05  发布在  Java
关注(0)|答案(4)|浏览(484)

当我运行代码时,它返回:
31和-1
我怎样才能摆脱-1?有没有不返回int方法的方法?我试图返回java.lang.integer(null),但它给了我一个错误。我想我用错了。
代码如下:

package com.company;

public class Main {

public static void main(String[] args) {
    int y = getDaysInMonth(1, 2020);
    System.out.println(y);
}

public static boolean isLeapYear(int year) {
    if (year > 1 && year < 9999) {
        if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
            return true;
        }
        return false;
    }
    return false;
}

public static int getDaysInMonth(int month, int year) {
    if ((month < 1 || month > 12) && (year < 1 || year > 9999)) {
        return -1;
    } else if (!isLeapYear(year)) {
        switch (month) {
            case 1:
                System.out.println(31);
                break;
            case 2:
                System.out.println(28);
                break;
            case 3:
                System.out.println(31);
                break;
            case 4:
                System.out.println(30);
                break;
            case 5:
                System.out.println(31);
                break;
            case 6:
                System.out.println(30);
                break;
            case 7:
                System.out.println(31);
                break;
            case 8:
                System.out.println(31);
                break;
            case 9:
                System.out.println(30);
                break;
            case 10:
                System.out.println(31);
                break;
            case 11:
                System.out.println(30);
                break;
            case 12:
                System.out.println(31);
                break;
            default:
                return -1;
        }
    } else if (isLeapYear(year)) {
        switch (month) {
            case 1:
                System.out.println(31);
                break;
            case 2:
                System.out.println(29);
                break;
            case 3:
                System.out.println(31);
                break;
            case 4:
                System.out.println(30);
                break;
            case 5:
                System.out.println(31);
                break;
            case 6:
                System.out.println(30);
                break;
            case 7:
                System.out.println(31);
                break;
            case 8:
                System.out.println(31);
                break;
            case 9:
                System.out.println(30);
                break;
            case 10:
                System.out.println(31);
                break;
            case 11:
                System.out.println(30);
                break;
            case 12:
                System.out.println(31);
                break;
            default:
                return -1;
        }
    } else return -1;
    return -1;
}

}
我试了几乎所有的方法,应该有一些我还不知道的东西。

8fsztsew

8fsztsew1#

有没有不返回int方法的方法?
是的,当然。抛出异常。例如:

if (month < 1 || month > 12) {
    throw new IllegalArgumentException("month value is out of range");
}

(提示:我注意到您现有的错误检查中有一个错误。重写时请仔细阅读。)
抛出异常会导致方法终止而不返回任何结果。即使方法签名说应该返回一个结果。您可以在oracle java教程中阅读:https://docs.oracle.com/javase/tutorial/essential/exceptions/definition.html. java教程的这一部分解释了什么是异常、如何抛出异常以及何时抛出异常、如何捕获异常以及未捕获异常时会发生什么。
话说回来,有几个地方你要回来 -1 . 你需要仔细检查每一个,以决定它是否真的是可能的。如果输入到 getDaysInMonth 如果是有效的,那么您应该始终能够计算“月份中的天数”值。你只需要在一个地方检查参数。
我的建议是在方法开始时检查参数值。方法的其余部分可以在参数有效的假设下进行编码。
最后,如果 getDaysInMonth 他回来了 -1 为了 getDaysInMonth(1, 2020) 这表明您在方法的逻辑中有一个bug。我建议您使用调试器来查找它。。。如果你不能通过阅读和逻辑分析你的代码来发现它。

q7solyqu

q7solyqu2#

java方法只能返回一种类型的结果:https://www.javatpoint.com/method-in-java
返回类型:返回类型是方法返回的数据类型。它可能有原始数据类型、对象、集合、void等。如果方法不返回任何内容,则使用void关键字。
作为解决方法:

使用 Package 类

你可以用 Integer 类作为返回类型并返回null。它并不比-1好多少,但它表示没有返回任何内容。

无效参数异常

扔这个:https://docs.oracle.com/javase/7/docs/api/java/lang/illegalargumentexception.html 这就是它的用途

default:
     throw new IllegalArgumentException("Invalid month value - out of range");

创建枚举

创建枚举类型并将其作为方法中的参数。这样就不会有任何方法得到未知值。

public enum Month {
    January(1), February(2), March(3), April(4),May(5),June(6), July(7), August(8), September(9), October(10),  November(11), December(12)
}
z9ju0rcb

z9ju0rcb3#

这是因为您首先在方法中打印,然后在y中再次打印方法的返回值。
与其每次都打印,不如尝试返回值。你写的程序也可以写得很有效率。举个例子:

public static int getDays(int monthNumber, int yearNumber)
{

if (monthNumber == 2 && !isLeapYear(yearNumber))
    return 28;
else if (monthNumber==2)
    return 29;
else if ((monthNumber >= 1) && (monthNumber <= 7) && (monthNumber % 2 ==1))
    return 31;
else if ((monthNumber >= 8) && (monthNumber %2==0))
    return 31;
else 
    return 30;
}
7ajki6be

7ajki6be4#

仔细看一下你的函数,就像现在一样,它总是返回-1而不是别的。
声明的函数 public static int getDaysInMonth(int month, int year) 必须返回 int 值,如果它成功完成。
它可以退出而不返回值的唯一情况是抛出异常。
所以,我假设你的函数需要返回一个月中的天数,而不仅仅是打印它。
以下是永远不会返回-1或除28、29、30、31以外的任何值的代码:

public static int getDaysInMonth(int month, int year) throws IllegalArgumentException {
    if (year < 1 || year > 9999) {
        throw new IllegalArgumentException(String.format("Invalid year %d must be between 1 and 9999", year));
    }

    switch (month) {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:            
            System.out.println(31);
            return 31;

        case 2:
            if (isLeapYear(year)) {
                System.out.println(29);
                return 29;
            } else {
                System.out.println(28);
                return 28;
            }

        case 4:
        case 6:
        case 9:
        case 11:
            System.out.println(30);
            return 30;
    }

    throw new IllegalArgumentException(String.format("Invalid month %d must be between 1 and 12", month));
}

请注意以下更改: case 在java中是“fall-through”,这意味着您不必反复编写相同的代码,您可以将具有相同结果的案例一个接一个地放到另一个案例中,而不必重复 brake 声明,它们将一起工作以得到相同的结果。
在函数开始时,我们只检查年份是否有效。如果月份无效 case 语句将执行,代码将直接转到 switch 阻止。这时我们知道月份是无效的,所以不需要检查,只需抛出异常即可。
任何抛出异常的函数都必须通过添加 throws 子句并列出用逗号分隔的例外情况。
调用抛出异常的函数时,必须将其 Package 在 try .. catrch 阻止。

相关问题