Java 如何跳过读入文件上的字符串以获得后面的浮点值?

Java 如何跳过读入文件上的字符串以获得后面的浮点值?,java,exception,Java,Exception,我试图读取一个给定的文件,该文件由不同的属性组成,我要给一个类的“worker”,这些属性由属性名给出,然后是一个与worker相关的浮点数,即:Fabrication.25 服务.45 诊断学.65 我试图使用scanner仅检索浮点值,但在尝试使用s.nextFloat()时出现异常错误;我不确定如何分割整个字符串,以便只返回浮点值 import java.io.File; import java.io.FileNotFoundException; import java.util.Scan

我试图读取一个给定的文件,该文件由不同的属性组成,我要给一个类的“worker”,这些属性由属性名给出,然后是一个与worker相关的浮点数,即:Fabrication.25 服务.45 诊断学.65

我试图使用scanner仅检索浮点值,但在尝试使用s.nextFloat()时出现异常错误;我不确定如何分割整个字符串,以便只返回浮点值

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;


public class Worker
{
        public static void main(String args[]) throws FileNotFoundException 
        {
            //creating File instance to reference text file in Java
           // File text = new File("Workers.txt");
            //Creating Scanner instance to read File in Java
            //File text = new File("Workers.txt");



            Scanner s = new Scanner(new File("Workers.txt"));
            TheWorker one = new TheWorker(s);

            System.out.println(one.Fab);

            s.close();  
        }   
}

class TheWorker
{
    String workername;
    String type;
    String CanWork = "Any";
    float hourlyRate;
    float Fab;
    float Serv;
    float Diag;
    float Trans;
    float Intake;
    float BW;
    float Paint;
    boolean working;

    public TheWorker(Scanner s) 
    {
        workername = s.nextLine();
        String type = s.next();
        if(type != "Full-Time")
        {
            String temp = s.next();
            if (temp.charAt(0) == '(')
            {
                CanWork = temp.substring(1,temp.length()-1);
                temp = s.next();
            }
            hourlyRate = Float.parseFloat(temp);
        }
        Fab = s.nextFloat();
        Serv = s.nextFloat();
        Diag = s.nextFloat();
        Trans = s.nextFloat();
        Intake = s.nextFloat();
        BW = s.nextFloat();
        Paint = s.nextFloat();  

    }


    TheWorker(String workername, String type, String CanWork, float hourlyRate, float Fab, float Serv, float Diag, float Trans, float Intake, float BW, float Paint, boolean working)
    {
        this.workername = workername;
        this.type = type;
        this.CanWork = CanWork;
        this.hourlyRate = hourlyRate;
        this.Fab = Fab;
        this.Serv = Serv;
        this.Diag = Diag;
        this.Trans = Trans;
        this.Intake = Intake;
        this.BW = BW;
        this.Paint = Paint;
        this.working = working;
    }
}

====Snippet from Workers.txt===
Eikichi Onizuka
Part-Time (Afternoon) 8.00 phr
Fabrication         .35
Service/Mechanics   .25 
Diagnostics         .25
Brake/Transmission  .25
Intake/Exhaust      .15
Body Work           .25
Paint/Finish        .45

Yusuke Urameshi
Part-Time (Afternoon) 7.60 phr
Fabrication         .35
Service/Mechanics   .55 
Diagnostics         .05
Brake/Transmission  .35
Intake/Exhaust      .45
Body Work           .15
Paint/Finish        .15




Exception in thread "main" java.lang.NumberFormatException: empty String
    at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)
    at sun.misc.FloatingDecimal.parseFloat(Unknown Source)
    at java.lang.Float.parseFloat(Unknown Source)
    at TheWorker.<init>(Worker.java:60)`enter code here`
    at Worker.main(Worker.java:18)
导入java.io.File;
导入java.io.FileNotFoundException;
导入java.util.Scanner;
公社工人
{
公共静态void main(字符串args[])引发FileNotFoundException
{
//在Java中创建引用文本文件的文件实例
//文件文本=新文件(“Workers.txt”);
//在Java中创建扫描仪实例以读取文件
//文件文本=新文件(“Workers.txt”);
扫描仪s=新扫描仪(新文件(“Workers.txt”);
工人1=新工人;
System.out.println(一个Fab);
s、 close();
}   
}
工人阶级
{
字符串工作名称;
字符串类型;
字符串CanWork=“Any”;
浮动小时利率;
浮动晶圆厂;
浮动服务;
浮动诊断;
浮动变速器;
浮式进水口;
浮动BW;
浮法漆;
布尔运算;
公共卫生工作者(s)
{
workername=s.nextLine();
字符串类型=s.next();
如果(类型!=“全职”)
{
字符串temp=s.next();
如果(温度字符(0)='(')
{
CanWork=临时子字符串(1,临时长度()-1);
temp=s.next();
}
hourlyRate=Float.parseFloat(温度);
}
Fab=s.nextFloat();
Serv=s.nextFloat();
Diag=s.nextFloat();
Trans=s.nextFloat();
摄入=s.nextFloat();
BW=s.nextFloat();
Paint=s.nextFloat();
}
工人(字符串工作名称、字符串类型、字符串可工作、浮动小时率、浮动制造、浮动服务、浮动诊断、浮动变速器、浮动进气、浮动BW、浮动油漆、布尔工作)
{
this.workername=workername;
this.type=type;
this.CanWork=CanWork;
this.hourlyRate=hourlyRate;
这个.Fab=Fab;
this.Serv=Serv;
this.Diag=Diag;
这个。Trans=Trans;
这个。摄入=摄入;
this.BW=BW;
这个。油漆=油漆;
这个。工作=工作;
}
}
==Workers.txt中的代码段===
大野荣吉
兼职(下午)8.00份
制造业
服务/机械师
诊断学25
刹车/变速器
进气/排气
身体工作
油漆/面漆
宇之介
兼职(下午)7.60份
制造业
服务/机械
诊断学.05
刹车/变速器
进气/排气
身体工作
油漆/面漆
线程“main”java.lang.NumberFormatException中的异常:空字符串
位于sun.misc.FloatingDecimal.readJavaFormatString(未知源)
在sun.misc.FloatingDecimal.parseFloat处(未知源)
位于java.lang.Float.parseFloat(未知源)
在Worker.(Worker.java:60)`这里输入代码`
at Worker.main(Worker.java:18)

根据您的输入文件,您应该

  • 读取行中的名称
  • 读取非全日制(下午)的行和拆分
    8.00
    phr
    -只有arr[1]是浮点数
  • 读取行X 7次,将每个行拆分为
    制造
    .35
    仅arr[1]是浮点

  • 参见

    在我看来,这个练习是从文本文件创建一个
    Worker
    对象的集合

    首先,让我们看看如何使用
    扫描器
    类读取文本文件。类
    扫描器
    有一个构造函数,该构造函数采用。但是
    路径
    是一个接口,因此您需要使用类来创建适当的
    路径

    Path p=Path.get(“Workers.txt”);
    扫描仪s=新扫描仪(p);
    
    现在,您可以使用
    扫描仪
    逐行读取文件

    while(s.hasNextLine()){
    字符串行=s.nextLine();
    }
    
    这基本上就是读取文件所需的所有代码。
    现在,您希望使用文件中的数据创建
    Worker
    对象。
    我将假设该文件与您发布的示例具有相同的格式,即每个“工作人员”详细信息正好占用九行,其中第一行是工作人员的姓名,每个“工作人员”之间用一个空行分隔。每一行都需要自己的特殊处理,因此我将管理一个
    计数器
    变量来告诉我刚才读取的工作人员详细信息。当我读取空行时,我知道我拥有单个“工作人员”的所有详细信息

    此外,我将把我创建的所有
    Worker
    对象存储在一个集合中,确切地说是一个集合

    import java.io.IOException;
    导入java.nio.file.Path;
    导入java.nio.file.path;
    导入java.util.ArrayList;
    导入java.util.List;
    导入java.util.Scanner;
    公社工人{
    私有字符串工作名;
    私有字符串类型;
    私有字符串canWork=“Any”;
    私人浮动小时利率;
    私人浮动晶圆厂;
    私人浮动服务;
    私有浮动诊断;
    私人浮动交易;
    私人浮式取水口;
    私人浮动bw;
    私人浮漆;
    私人布尔运算;
    //建造师
    公共工作者(字符串工作者名称,
    字符串类型,
    弦可以工作,
    浮动小时利率,
    浮动晶圆厂,
    浮动服务,
    浮动诊断,
    浮动变速器,
    浮式进水口,
    浮动bw,
    浮漆,
    布尔运算){