【问题标题】:Java Error: first type: double, second type: StringJava 错误:第一种类型:double,第二种类型:String
【发布时间】:2015-02-13 03:46:55
【问题描述】:

我刚开始学习 Java 编程,在我的第一个项目的最后一部分中收到了这个错误,“税前费用”我一定是弄乱了我的变量,但我不确定。有任何想法吗?

这是我在编译器上收到的错误:

错误:二元运算符的操作数类型错误

第一种类型:双精度

第二种类型:字符串

2 个错误

import java.util.Scanner;

public class project1Naja {

  public static void main(String[] args) {  

     String firstName; // To hold first name
     String lastName; // To hold last name
     String hours; // Child's hours   
     final String date; // Date of Service
     final double RATE; // Hourly rate
     final double TAX_RATE; // Tax percentage
     int fee; // Cost before tax added
     int taxAmount; // Tax total
     double totalFee; // Fee including tax

     // Scanner created to read input.
     Scanner childCare = new Scanner(System.in);

     System.out.print("Enter your first name: " );
     firstName = childCare.nextLine();

     System.out.print("Enter your last name: " );
     lastName = childCare.nextLine();

     System.out.print("Enter the child's hours here: " );
     hours = childCare.nextLine();

     System.out.print("Enter date here: " );
     date = childCare.next();    

     System.out.println("Child Care Service Bill For: " + firstName 
                    + lastName);
     System.out.println("Date of Service: " + date);    


     System.out.println("Number of hours: " + hours);    
     System.out.println("Fee before taxes: " = RATE * hours); 
  }
}

【问题讨论】:

    标签: java variables operators


    【解决方案1】:

    你需要在访问之前初始化局部变量,

    在这种情况下,RATE 是局部变量,在访问时未初始化

     System.out.println("Fee before taxes: " = RATE * hours); 
    

    初始化它

     final double RATE = 0.50; // some rate value
    

    还有String不能与double相乘

    【讨论】:

    • 嗨。谢谢你的帮助。我在 1200 页书的第 2 章。所以,我不是 100% 确定我需要先初始化变量是什么意思。您介意再详细说明一下吗?
    • 这是我想弄清楚的另一件事,我可以使用什么数据类型对两者都有好处。我正在阅读的书在一定程度上很清楚。
    【解决方案2】:

    这里要注意两件事..

    1. String hours;

    hours 是字符串,因此不能将任何变量与字符串相乘

    1. System.out.println("Fee before taxes: " = RATE * hours);

    语法错误...应该是System.out.println("Fee before taxes: =" + RATE * hours);

    还有 RATE 和任何你乘以它的东西请初始化两者。

    【讨论】:

    • 初始化意味着你需要给他们一些默认值,比如 double RATE = 0 和 int hours = 1 这样的东西
    • 很好的信息,谢谢。我完全错过了错误的语法。我正在尝试将数小时的数据类型更改为我认为可以像最终双倍速率 = ... 或双倍速率一样工作的东西,但我仍然收到编译器错误。 “不兼容的类型:字符串无法转换为 int,...等”我不确定在尝试了似乎合适的数据类型后我应该使用什么其他数据类型。
    • 你可以将它作为 Integer.parseInt (hours) 与 int 一致
    【解决方案3】:

    您的代码无法编译,因为首先" " 中的= 用于赋值,所以首先要做的是将其保留在"Fee before taxes: " 中。

    第二,你不能在Stringdouble之间使用乘法运算符*,为了做到这一点,你需要像这样解析String:@ 987654330@.

    第三所有局部变量(final与否)在使用前需要初始化,因为它们在Java中没有默认值,你可以学习更多关于来自Java docs 的局部变量。

    Definite Assignment中也有详细说明:

    对于局部变量或空白最终字段 x 的每次访问,x 必须是 肯定是在访问之前赋值的,否则会发生编译时错误。

    因此,对于您的示例,分配之前使用的唯一变量是RATE,因此您不必初始化其他变量:

    final double RATE = 0; // for example
    

    最后,您的代码必须如下所示:

    import java.util.Scanner;
    
      public class project1Naja {
    
      public class project1Naja {
    
        public static void main(String[] args) {
    
            String firstName; // To hold first name
            String lastName; // To hold last name
            String hours; // Child's hours
            final String date; // Date of Service
            final double RATE = 0; // Hourly rate
            final double TAX_RATE = 0; // Tax percentage
            int fee; // Cost before tax added
            int taxAmount; // Tax total
            double totalFee; // Fee including tax
    
            // Scanner created to read input.
            Scanner childCare = new Scanner(System.in);
    
            System.out.print("Enter your first name: ");
            firstName = childCare.nextLine();
    
            System.out.print("Enter your last name: ");
            lastName = childCare.nextLine();
    
            System.out.print("Enter the child's hours here: ");
            hours = childCare.nextLine();
    
            System.out.print("Enter date here: ");
            date = childCare.next();
    
            System.out.println("Child Care Service Bill For: " + firstName
                    + lastName);
            System.out.println("Date of Service: " + date);
    
            System.out.println("Number of hours: " + hours);
            System.out.println("Fee before taxes: " + RATE
                    * Double.parseDouble(hours));
        }
    
    }
    

    【讨论】:

    • 您的提示效果很好。感谢您提供详细的示例。它真的帮助我从视觉上理解它。
    • @Jessica 欢迎您,如果这解决了您的问题,请考虑通过单击复选标记接受它。这向更广泛的社区表明您找到了解决方案。
    【解决方案4】:

    这里有三件事会导致您的代码无法正确编译。

    1. 您将小时数定义为String。如果您只想显示字符串而不对其进行操作或将其与另一个字符串组合,这将是可以的。但是,这一行:

      System.out.println("Fee before taxes: " = RATE * hours);
      

      试图告诉编译器将类型String 与类型double 相乘。你不能在java中做到这一点。必须将小时数定义为 double 以匹配您的 RATE,或定义为 byteintshortlongfloat。请记住,如果您想要部分小时(例如 0.5 小时),您将需要使用 doublefloat,因为这是仅有的两种可以在不添加强制转换类型的情况下使用小数操作的原始数据类型.

      或者,您可以将String 解析为double,看起来像Double.parseDouble(hours),但这是处理问题的间接“解决方法”,因此我建议更改而是几个小时。

    2. 每当您在 java 中声明任何数据类型的 final 时,您也必须为其分配一个值。您不能像在变量列表中那样简单地将其保留为未定义。它应该说类似于

      final double RATE = 7.2;
      

      因为这个当你尝试线路时:

      System.out.println("Fee before taxes: " = RATE * hours);
      

      编译器调用了尚未声明的final,因此出现编译错误。另一方面,变量可以保持未初始化,但必须先为其分配一个与其数据类型匹配的值,然后才能在代码行中实际引用它们。如果不是,您将收到编译错误。

    3. 在您的最终打印声明中,您有("Fee before taxes" = RATE * hours)。 这是一个简单的语法错误。您永远不能在 print 语句中使用操作数 =。唯一允许的操作数(为了这个基本情况)是+ 以向字符串添加更多文本。此行应为:

      System.out.println("Fee before taxes" + (RATE * hours));
      

    简短
    将变量 hours 更改为键入 double,将 final RATE 分配给一个数字,并更改最终打印语句中的语法错误。之后你应该一帆风顺。

    附言
    我还注意到您还有两个名为“date”和“TAX_RATE”的决赛。这些也应该声明,否则在实现它们时会遇到类似的错误。

    希望这会有所帮助!

    【讨论】:

    • 哇哦。谢谢大家的澄清。有时,即使是一本好书也不能解释简单的事实,但是我肯定错过了一些明显的事实,比如使用 final 和误用语法。
    • 练习,练习,练习,它会变得更容易
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    相关资源
    最近更新 更多