java - 秒转换器.java :19: error: incompatible types: String cannot be converted to int

标签 java

我必须为教科书练习编写一个程序。预期目的是输入秒数,并将其转换为天、小时、分钟和秒。

import java.util.Scanner;
import static java.lang.System.*;

    public class SecondsConverter {

    public static void main(String[] args) {

       Scanner keyboard = new Scanner(System.in);

       System.out.print("Enter a number for seconds :: ");
       int input = keyboard.nextInt();

       int days = input/86400;
       int hours = (input%86400)/3600;
       int minutes = ((input%86400)/3600)/60;
       int seconds = ((input%86400)/3600)%60;

       System.out.println(days = " days, " + +hours + " hours, " + +minutes + " minutes, and " + +seconds + " seconds");

     }
}

这是完整的错误:

----jGRASP exec: javac -g SecondsConverter.java

SecondsConverter.java:19: error: incompatible types: String cannot be converted to int
System.out.println(days = " days, " + +hours + " hours, " + +minutes + " minutes, and " + +seconds + " seconds");
                                                                                                   ^
1 error

----jGRASP wedge2: exit code for process is 1.
----jGRASP: operation complete.

最佳答案

关于您的具体问题,这是由于 System.out.println() 中的语法不正确造成的。打电话。

您有太多的加号运算符,并且还使用了等于。你想要这样的东西:

System.out.println(days + " days, " +hours + " hours, " +minutes + " minutes, and " +seconds + " seconds");

顺便说一句,当用户输入值 60 时,您的代码不起作用,它会打印“0 天、0 小时、0 分钟和 0 秒”

此外,您永远不会关闭 Scanner任何一个。请务必调用keyboard.close();当你完成它时。

编辑: 以下项目是更多的代码审查和一般增强功能,我认为它们可能会帮助您完成此编程工作和其他编程工作。由于这个程序很简单,我认为这可能是说明一些重要原则的好机会。

首先,考虑在设计代码时将如何测试代码。我建议您将业务逻辑(计算结果的部分)分离到一个单独的方法中。这将允许您调用该方法并向其传递自动输入,而不必手动输入值来测试它。以下是删除了业务逻辑的示例:

public static void main(String[] args) {

   Scanner keyboard = new Scanner(System.in);

   System.out.print("Enter a number for seconds :: ");
   int input = keyboard.nextInt();

   if(input < 0){
       System.out.println("Sorry, negative values are not valid.");
   }else{
       SecondConversionResult result = calculate(input);

       System.out.println(result.getDays() + " days, " +result.getHours() + " hours, " +result.getMinutes() + " minutes, and " +result.getSeconds() + " seconds");
   }
 }

/**
 * Calculates the number of days, hours, minutes, and seconds represented by the specified number of seconds.
 * For example 3600 seconds is 1 hour.
 * @param input the number of seconds to convert to days, hours, minutes, and seconds 
 * @return an object representing the result of converting a number of seconds to number of days, hours, minutes, and seconds 
 */
public static SecondConversionResult calculate(int input){
    int seconds = ...
    int minutes = ...
    int hours = ...
    int days = ...

    return new SecondConversionResult(seconds, minutes, hours, days);
}

您会注意到这个新方法,我简单地称之为 calculate接受一个整数输入并生成一个表示结果的对象。该对象是 SecondConversionResult 的实例这是我创建的一个简单的类来保存转换的结果。该类如下所示:

public class SecondConversionResult {
    private int seconds, minutes, hours, days;

    public SecondConversionResult(int sec, int min, int hrs, int days){
        seconds = sec;
        minutes = min;
        hours = hrs;
        this.days = days;
    }

    public int getSeconds() {
        return seconds;
    }

    public int getMinutes() {
        return minutes;
    }

    public int getHours() {
        return hours;
    }

    public int getDays() {
        return days;
    }
}

注意:在大多数情况下,我会为像这样的类创建 setter 方法,但由于我们在这里所做的事情很简单,我认为这并不是真正必要的。

您可能想知道这一切让我们能够做什么。好吧,现在我们有了一个单独的方法,可以传递输入并从中获取结果,我们可以编写一些非常简单的 JUnit 测试来确保我们的代码按预期工作。如果您不熟悉 JUnit,您可以阅读 Getting Started Guide .

例如,我们可以编写非常具体的测试,如下所示:

import static org.junit.Assert.*;

import org.junit.Test;

public class JUnitTests {
    @Test
    public void test0() {
        SecondConversionResult result = Main.calculate(0);
        assertEquals(0, result.getDays());
        assertEquals(0, result.getHours());
        assertEquals(0, result.getMinutes());
        assertEquals(0, result.getSeconds());
    }
...

或者我们可以编写一个非常通用的测试,如下所示,测试从 0 秒到 10 天(864000 秒)的所有值:

@Test
public void testAllUpTo10Days() {
    for(int days = 0; days < 10; days++){
        for(int hours = 0; hours < 24; hours++){
            for(int min = 0; min < 60; min++){
                for(int sec = 0; sec < 60; sec++){
                    int input = sec + min*60 + hours*60*60 + days*24*60*60;
                    System.out.println("Testing input of "+input);
                    SecondConversionResult result = Main.calculate(input);
                    assertEquals(days, result.getDays());
                    assertEquals(hours, result.getHours());
                    assertEquals(min, result.getMinutes());
                    assertEquals(sec, result.getSeconds());
                }
            }
        }
    }
}

现在我们有一个非常简单的方法来确保我们的解决方案适用于我们需要的任何场景。我希望这对您现在和将来都有帮助。

关于java - 秒转换器.java :19: error: incompatible types: String cannot be converted to int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39886472/

相关文章:

java - 第一次持久化之前的 Hibernate 回调

java - 如何在jpanel上绘制椭圆

java - 需要自定义Gson反序列化,只需要单元素JSON,转为Object

java - SwingUtilities.invokeLater

java - DynamicJasper - 分组列似乎没有分组

java - 如何在我的 .net 和 Java 桌面应用程序中添加广告(如 google adsense)?

java - Jsoup 如果包含属性则获取值

oop - Map 和 SortedMap - 冗余方法声明

java - 如果客户端继续监听请求,请检查 servlet API?

JAVA RMI 添加示例