0

我很抱歉,但我是编程新手,我在编写程序时遇到了困难。原程序如下:

import java.io.*;
import java.io.IOException;
import java.io.InputStreamReader;

class buildABoat{

    String boatName;      // Boat name
    void buildABoat(){      
        String BoatName;            
    }

    void nameTheBoat() {        
        try {           
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("\n\nWhat should we name this vessel? \n\n");
            this.boatName = br.readLine();
            System.out.println("\n\nThe " + boatName + " is ready to sail!\n");             
        }           
        catch (IOException e) {                 
        }   
    }
}

class proj1{

    public static void main(String[] arg){

        buildABoat boat1;
        buildABoat boat2;
        buildABoat boat3;
        buildABoat boat4;
        buildABoat boat5;

        boat1 = new buildABoat();
        boat2 = new buildABoat();
        boat3 = new buildABoat();
        boat4 = new buildABoat();
        boat5 = new buildABoat();

        boat1.nameTheBoat();
        boat2.nameTheBoat();
        boat3.nameTheBoat();
        boat4.nameTheBoat();
        boat5.nameTheBoat();

        System.out.println("(Press ENTER to exit)");

        try {           
            System.in.read();
        }           
        catch (IOException e) {         
            return;
        }
    }
}

这会产生以下结果:

What should we name this vessel?
Enterprise
The Enterprise is ready to sail!
What should we name this vessel?
Columbia
The Columbia is ready to sail!
What should we name this vessel?
Challenger
The Challenger is ready to sail!
What should we name this vessel?
Atlantis
The Atlantis is ready to sail!
What should we name this vessel?
Endeavor
The Endeavor is ready to sail!
(Press ENTER to exit)

我试图将其更改为以下内容:

import java.io.*;
import java.io.IOException;
import java.io.InputStreamReader;

class buildABoat{    
    String boatName;      // Boat name

    void buildABoat(){
        String BoatName;
    }

    void nameTheBoat() {
        try {           
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("\n\nWhat should we name this vessel? \n\n");
            this.boatName = br.readLine();
            System.out.println("\n\nThe " + boatName + " is ready to sail!\n");             
        }           
        catch (IOException e) {                 
        }   
    }
}

class proj1{

    public static void main(String[] arg){

        Boat[] boat;            
        boat = new Boat[5];    
        for(int i = 0; i <= Boat.Length; i++){          
            nameTheBoat();          
        }           
        System.out.println("(Press ENTER to exit)");

        try {           
            System.in.read();
        }           
        catch (IOException e) {         
            return;
        }
    }
}

这当然会产生以下错误:

proj1.java:71: error: cannot find symbol
                for(int i = 0; i <= Boat.Length; i++){
                                        ^
  symbol:   variable Length
  location: class Boat
proj1.java:73: error: cannot find symbol
                        nameTheBoat();
                        ^
  symbol:   method nameTheBoat()
  location: class proj1
2 errors

我在新程序中缺少什么?

4

8 回答 8

2

使用小写的长度

for(int i = 0; i <= Boat.length; i++)
于 2012-05-03T02:35:35.393 回答
2

尝试做boat.nameTheBoat()而不是仅仅nameTheBoat()

for(int i = 0; i <= boat.length; i++){          
        boat[i].nameTheBoat();          
    }    

boat 是类的实例Boat(可能应该是buildABoat)。这些看起来像是编译器错误而不是运行时错误,所以编译器应该给你一些关于确切行号的提示(就像它所做的那样)。

于 2012-05-03T02:38:04.753 回答
2

正如 Nurlan 提到的,第一个错误是因为您使用大写 L作为数组的长度属性。实际属性以小写 l 开头。

第二个错误是因为方法nameTheBoat是名为buildABoat的类的一部分,但您试图调用它,就好像它是您的主类的一部分一样。您需要一个buildABoat对象的实例才能调用此方法。

另一个建议:为了遵守 java 命名约定,你不应该以小写字母开头的类名。类应始终以大写字母开头。方法应始终以小写字母开头。

于 2012-05-03T02:40:21.670 回答
2

您必须尝试计算对象而不是类的长度。所以,它应该是boat.length,这里的小船是你的对象

如果方法是静态方法,则使用类名调用方法。

于 2012-05-03T02:40:11.317 回答
1

你在哪里

nameTheBoat();

在你的 for() 循环中,你需要

boat[i] = new Boat();
boat[i].nameTheBoat();

原因是:1)nameTheBoat()是一种只对 类型 对象进行操作的方法Boat。你没有给它任何工作对象。2)boat[] = new Boat[5];初始化一个 Array 对象,但不在对象中创建 5 个新Boat的 s Array。因此,您需要先创建这 5 个Boat,然后才能Boat在它们上运行方法。否则你会得到一个空指针错误。

编辑:当然正如其他人提到的,boat.length是数组的长度boatboat.Length是错误的。

享受!

于 2012-05-03T02:43:08.727 回答
0

您创建的对象数组是boat = new Boat[5];. 理想情况下,您的整个代码应该是这样的

Boat[] boat = new Boat[5];    
for(int i = 0; i <= Boat.Length; i++){          
boat[i] = new Boat();
boat[i].nameTheBoat();          
}
于 2012-05-03T02:38:55.050 回答
0

你有几个问题。

一个是boat作为一个数组

Boat[] boat;            
boat = new Boat[5];    
for(int i = 0; i <= Boat.Length; i++){          
    nameTheBoat();          
} 

要访问数组length,它将boat.length代替您拥有的。

我看到的下一个问题是您对nameTheBoat(). 该方法是buildABoat类的一部分。

于 2012-05-03T02:42:37.657 回答
0

这段代码看起来像是一个意外的构造函数。

class buildABoat{    
    String boatName;      // Boat name

    void buildABoat(){
        String BoatName;
    }

如果 void buildABoat () 是一个方法(void 这么说),为什么要在其中声明一个局部变量而不使用它?

并且不要将命名良好的属性的名称作为注释重复。

class BuildABoat {    
    private String boatName;   

    public BuildABoat (String name) {
        boatName = name;
    }

这会有些道理。您现在有一个类,可以通过传递一个保存在类中的船名来实例化它。

在您的 Proj1-Class 中,您拆分声明和初始化。这是一个坏习惯。有时它是无法避免的,但如果是,请避免它。

class Proj1 {

    public static void main(String[] arg){

        BuildABoat [] boat = new BuildABoat[5];    
        for(int i = 0; i <= boat.length; i++) {
            // to make this work, we have to change the 
            // buildABoat
            boat[i] = new BuildABoat (BuildABoat.nameTheBoat ());
        }
        System.out.println ("(Press ENTER to exit)");
        try {           
            System.in.read ();
        }           
        catch (IOException ignored) {         
            return;
        }
    }
}

方法 nameTheBoat 必须是静态的,如果我们在没有实际拥有 (builda)boat 的情况下调用它。

public static String nameTheBoat () {
    try {           
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.println ("\n\nWhat should we name this vessel? \n\n");
        String s = br.readLine ();
        System.out.println ("\n\nThe " + s + " is ready to sail!\n");
        return s;
    }
      catch (IOException e) {
        return "";
    }   
}

我希望代码能做一些你想要的。

于 2012-05-03T02:45:47.583 回答