当我运行代码时,它返回:
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;
}
}
我试了几乎所有的方法,应该有一些我还不知道的东西。
4条答案
按热度按时间8fsztsew1#
有没有不返回int方法的方法?
是的,当然。抛出异常。例如:
(提示:我注意到您现有的错误检查中有一个错误。重写时请仔细阅读。)
抛出异常会导致方法终止而不返回任何结果。即使方法签名说应该返回一个结果。您可以在oracle java教程中阅读:https://docs.oracle.com/javase/tutorial/essential/exceptions/definition.html. java教程的这一部分解释了什么是异常、如何抛出异常以及何时抛出异常、如何捕获异常以及未捕获异常时会发生什么。
话说回来,有几个地方你要回来
-1
. 你需要仔细检查每一个,以决定它是否真的是可能的。如果输入到getDaysInMonth
如果是有效的,那么您应该始终能够计算“月份中的天数”值。你只需要在一个地方检查参数。我的建议是在方法开始时检查参数值。方法的其余部分可以在参数有效的假设下进行编码。
最后,如果
getDaysInMonth
他回来了-1
为了getDaysInMonth(1, 2020)
这表明您在方法的逻辑中有一个bug。我建议您使用调试器来查找它。。。如果你不能通过阅读和逻辑分析你的代码来发现它。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 这就是它的用途
创建枚举
创建枚举类型并将其作为方法中的参数。这样就不会有任何方法得到未知值。
z9ju0rcb3#
这是因为您首先在方法中打印,然后在y中再次打印方法的返回值。
与其每次都打印,不如尝试返回值。你写的程序也可以写得很有效率。举个例子:
7ajki6be4#
仔细看一下你的函数,就像现在一样,它总是返回-1而不是别的。
声明的函数
public static int getDaysInMonth(int month, int year)
必须返回int
值,如果它成功完成。它可以退出而不返回值的唯一情况是抛出异常。
所以,我假设你的函数需要返回一个月中的天数,而不仅仅是打印它。
以下是永远不会返回-1或除28、29、30、31以外的任何值的代码:
请注意以下更改:
case
在java中是“fall-through”,这意味着您不必反复编写相同的代码,您可以将具有相同结果的案例一个接一个地放到另一个案例中,而不必重复brake
声明,它们将一起工作以得到相同的结果。在函数开始时,我们只检查年份是否有效。如果月份无效
case
语句将执行,代码将直接转到switch
阻止。这时我们知道月份是无效的,所以不需要检查,只需抛出异常即可。任何抛出异常的函数都必须通过添加
throws
子句并列出用逗号分隔的例外情况。调用抛出异常的函数时,必须将其 Package 在
try .. catrch
阻止。