【问题标题】:Android: NoSuchElementException with StringTokenizerAndroid:带有 StringTokenizer 的 NoSuchElementException
【发布时间】:2015-07-26 08:29:54
【问题描述】:

这是我的 Android 项目的类之一。我收到了NoSuchElementException

当我注释掉两个 StringTokenizers(stst1)以及 st.nextToken()st1.nextToken() 时,应用程序运行良好。

package com.example.client_nic;

import java.util.Calendar;
import java.util.StringTokenizer;

import com.example.client_nic.DataFields.fields;

import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;

import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class Meeting extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater,
            @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        View view = inflater.inflate(R.layout.clientmeeting, container,false);  //why false still unclear
        EditText nameev= (EditText)view.findViewById(R.id.nameev);
        final String name = nameev.getText().toString();
        if(name==null){
            Toast.makeText(getActivity(), "Name cannot be Empty", Toast.LENGTH_SHORT).show();
        }

        EditText contactev= (EditText)view.findViewById(R.id.contactev);
        final String contact = contactev.getText().toString();

        EditText addressev= (EditText)view.findViewById(R.id.Addressev);
        final String address = addressev.getText().toString();

        EditText remarksev= (EditText)view.findViewById(R.id.remarksev);
        final String remarks = remarksev.getText().toString();

        EditText dateev = (EditText)view.findViewById(R.id.dateev);
        final String date = dateev.getText().toString();
        StringTokenizer st = new StringTokenizer(date, "/");


        final int day = Integer.parseInt(st.nextToken());
        final int month = Integer.parseInt(st.nextToken());
        final int year = Integer.parseInt(st.nextToken());

        EditText timeev = (EditText)view.findViewById(R.id.timeev);
        final String time = timeev.getText().toString();

        StringTokenizer st1 = new StringTokenizer(time, ":");
        final int hourOfDay  = Integer.parseInt(st1.nextToken());
        final int minute = Integer.parseInt(st1.nextToken());

        Button button = (Button)view.findViewById(R.id.button);
        button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                Calendar calender = Calendar.getInstance();
                calender.set(year, month, day, hourOfDay, minute);
                long inputtime = calender.getTimeInMillis();


                long presenttime = System.currentTimeMillis();
                if(inputtime<presenttime){
                    Toast.makeText(getActivity(), "Time has already passed", Toast.LENGTH_SHORT).show();
                }
                else{
                    String insert = "INSERT INTO "+fields.table_name+" VALUES('"+name+"','"+contact+"','"+address+"','"+remarks+"','"+date+"','"+time+"' ) ";                   
                    Datastore ds = new Datastore(getActivity());
                    SQLiteDatabase sql = ds.getWritableDatabase();
                    sql.execSQL(insert);
                }
            }
        });

        return view;
    }
}

【问题讨论】:

标签: android stringtokenizer


【解决方案1】:

您正在使用st1.nextToken() st.nextToken(),而没有导致结果的令牌

NoSuchElementException

你只需要检查 hasMoreTokens 是否为真然后你就可以使用它:

while(token.hasMoreTokens())
{
//use st.nextToken()
}

Documentation including an example on how to use StringTokenizer!

【讨论】:

    【解决方案2】:

    这意味着您在EditText dateev 中输入的日期没有包含足够的/ 字符,或者您在EditText timeev 中输入的时间没有包含足够的: 字符。

    您可能应该使用String.split() 而不是StringTokenizer,正如StringTokenizer 的类概述中所建议的那样。当然,这本身并不能解决您的问题。

    因此,为了解决您的问题,当您从用户那里获取文本时,您应该检查所需的元素数量,而不是仅仅假设文本格式正确。所以你会做这样的事情:

    String[] dateStrings = date.split("/");
    
    int day;
    int month;
    int year;
    if (dateStrings.length == 3) {
        day = Integer.parseInt(dateStrings[0]);
        month = Integer.parseInt(dateStrings[1]);
        year = Integer.parseInt(dateStrings[2]);
    }
    

    time 也是如此。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-24
      • 2016-04-29
      • 2014-10-19
      • 1970-01-01
      • 2015-10-16
      • 1970-01-01
      • 2018-05-27
      • 2021-07-29
      相关资源
      最近更新 更多