Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Въпрос за грешка String index out of range: 4

Featured Replies

Здравейте, пиша програма която брои време и пари. Проблемът се появява когато "Време: 0:03:59; Сума: 1.59". а грешката е "Exception in thread "AWT-EventQueue-0" java.lang.StringIndexOutOfBoundsException: String index out of range: 4". Ето го и кода:

 

public static String k;  private static int sec = 0;   private static int min = 0;   private static int hr = 0;   static String secstr;   static String minstr;   String hrstr;   static double pari=0;   static Timer timer = new Timer(1000, null);    public static void stringyt() {    timer.addActionListener(new ActionListener() {     public void actionPerformed(ActionEvent e) {          sec++; pari=pari+0.0066666666666667; if (sec==60) {      min++;      sec=0; } if (min==60) {      hr++;      min=0; } if (sec <= 9) {      secstr="0"+Integer.toString(sec); } else {      secstr=Integer.toString(sec); }     if (min <= 9) {      minstr="0"+Integer.toString(min); } else {      minstr=Integer.toString(min); } String paristring=Double.toString(pari); paristring=paristring.substring(0,4);     k=""; k=("Време: "+Integer.toString(hr)+":"+minstr+":"+secstr+"; Сума: "+paristring); display.setText(""); display.setText(k);       }    });   }

 

 

 

Ако коментирам "paristring=paristring.substring(0,4);" работи без проблем. Някакви идеи?

Редактирано от Stoianoff (преглед на промените)

  • Автор

Ето го и целия код:

 

 

import java.awt.Container; import java.awt.Label; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JTextField; import javax.swing.Timer; public class mlnktimer {    final static JFrame frame = new JFrame("MLNK Timer");    static Label inf = new Label("Изберете Оператор:");   static Font f = new Font("Dialog", Font.BOLD, 16);   static JButton op1 = new JButton("Оератор 1");   static JButton op2 = new JButton("Оератор 2");   static JButton op3 = new JButton("Оератор 3");   static JButton cancel = new JButton("Cancel");   static JTextField display = new JTextField();    public static String k;  private static int sec = 0;   private static int min = 0;   private static int hr = 0;   static String secstr;   static String minstr;   String hrstr;   static double pari=0;   static Timer timer = new Timer(1000, null);    public static void stringyt() {    timer.addActionListener(new ActionListener() {     public void actionPerformed(ActionEvent e) {          sec++; pari=pari+0.0066666666666667; if (sec==60) {      min++;      sec=0; } if (min==60) {      hr++;      min=0; } if (sec <= 9) {      secstr="0"+Integer.toString(sec); } else {      secstr=Integer.toString(sec); }     if (min <= 9) {      minstr="0"+Integer.toString(min); } else {      minstr=Integer.toString(min); } String paristring=Double.toString(pari); paristring=paristring.substring(0,4);     k=""; k=("Време: "+Integer.toString(hr)+":"+minstr+":"+secstr+"; Сума: "+paristring); display.setText(""); display.setText(k);       }    });   }    public static void changeframetotimer(){        Container contentPane = frame.getContentPane();    contentPane.remove(inf);    contentPane.remove(op1);    contentPane.remove(op2);        contentPane.remove(op3);    contentPane.remove(cancel);    contentPane.add(display);    display.setBounds(15, 20, 170, 25);        frame.setSize(200, 200); frame.setVisible(true); frame.setResizable(false); frame.setLocation(300, 200);    }        public static void main(String[] args) {         frame.setLayout(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);                           ActionListener op1l = new ActionListener() {      public void actionPerformed(ActionEvent actionEvent) {        stringyt();        timer.start();        changeframetotimer();                    } };         ActionListener cancell = new ActionListener() {      public void actionPerformed(ActionEvent actionEvent) {          frame.dispose();          } };             final Container contentPane = frame.getContentPane();        contentPane.add(inf);    inf.setBounds(15, 20, 170, 25);    inf.setFont(f);        contentPane.add(op1);    op1.setBounds(30, 70, 130, 30);    op1.addActionListener(op1l);        contentPane.add(op2);    op2.setBounds(30, 110, 130, 30);        contentPane.add(op3);    op3.setBounds(30, 150, 130, 30);        contentPane.add(cancel);    cancel.setBounds(30, 210, 130, 30);    cancel.addActionListener(cancell);        frame.setSize(200, 300); frame.setVisible(true); frame.setResizable(false); frame.setLocation(300, 200);    } }  

Здравей, проблемът беше в това, че инкрементваш променливата всеки път с 0.0066666666666667 и когато достигне време 3.59 променливата става точно 1.6, което е проблем, защото ти викаш метода "substring(0,4)", но в конктретният случай стринга е с дължина 3(1.6) и индекс 3 не съществува и от тук идва "exception". Решението е да използваш DecimalFormat от Java библиотеката, чиято функция е точно такава да зададеш колко числа искаш да се виждат след запетаята на десетичната дроб. Ето и кода с 2 реда промяна:

 

import java.awt.Container;import java.awt.Label;import java.awt.Font;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.text.DecimalFormat;import java.text.NumberFormat;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JTextField;import javax.swing.Timer;public class mlnktimer {   	 final static JFrame frame = new JFrame("MLNK Timer");   	 static Label inf = new Label("Изберете Оператор:");    static Font f = new Font("Dialog", Font.BOLD, 16);    static JButton op1 = new JButton("Оератор 1");    static JButton op2 = new JButton("Оератор 2");    static JButton op3 = new JButton("Оератор 3");    static JButton cancel = new JButton("Cancel");    static JTextField display = new JTextField();   	 public static String k;    private static int sec = 0;    private static int min = 0;    private static int hr = 0;    static String secstr;    static String minstr;    String hrstr;    static double pari=0;    static Timer timer = new Timer(1000, null);   	 public static void stringyt() {	    timer.addActionListener(new ActionListener() {		   			 public void actionPerformed(ActionEvent e) {			   				 sec++;			    pari=pari+0.0066666666666667;			    if (sec==60)			    {				    min++;				    sec=0;			    }			    if (min==60)			    {				    hr++;				    min=0;			    }			    if (sec <= 9)			    {				    secstr="0"+Integer.toString(sec);			    }			    else			    {				    secstr=Integer.toString(sec);			    }			   				 if (min <= 9)			    {				    minstr="0"+Integer.toString(min);			    }			    else			    {				    minstr=Integer.toString(min);			    }				  				 NumberFormat decimalFormat = new DecimalFormat("#0.00");			    String paristring=String.valueOf(decimalFormat.format(pari));			    k="";			    k=("Време: "+Integer.toString(hr)+":"+minstr+":"+secstr+"; Сума: " + paristring);			    display.setText("");			    display.setText(k);			   			 }	    });	   }   	 public static void changeframetotimer(){	   		 Container contentPane = frame.getContentPane();	    contentPane.remove(inf);	    contentPane.remove(op1);	    contentPane.remove(op2);	   		 contentPane.remove(op3);	    contentPane.remove(cancel);	    contentPane.add(display);	    display.setBounds(15, 20, 170, 25);	   		 frame.setSize(200, 200);	    frame.setVisible(true);	    frame.setResizable(false);	    frame.setLocation(300, 200);   	 }           	 public static void main(String[] args) {	   	    		 frame.setLayout(null);	    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	   	    	    	    	   	    	    		 ActionListener op1l = new ActionListener() {		    public void actionPerformed(ActionEvent actionEvent) {			    stringyt();			    timer.start();			    changeframetotimer();				   	    			 }	    };	   	    		 ActionListener cancell = new ActionListener() {		    public void actionPerformed(ActionEvent actionEvent) {				    frame.dispose();	   			 }	    };	   	    	    		 final Container contentPane = frame.getContentPane();	   		 contentPane.add(inf);	    inf.setBounds(15, 20, 170, 25);	    inf.setFont(f);	   		 contentPane.add(op1);	    op1.setBounds(30, 70, 130, 30);	    op1.addActionListener(op1l);	   		 contentPane.add(op2);	    op2.setBounds(30, 110, 130, 30);	   		 contentPane.add(op3);	    op3.setBounds(30, 150, 130, 30);	   		 contentPane.add(cancel);	    cancel.setBounds(30, 210, 130, 30);	    cancel.addActionListener(cancell);	   		 frame.setSize(200, 300);	    frame.setVisible(true);	    frame.setResizable(false);	    frame.setLocation(300, 200);   	 }}

Редактирано от Syrex (преглед на промените)

  • Автор

Прекалено очевидно за да го забележа :ph34r: , Благодаря много.

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    32%
    Дарени 315 € от нужните 1 000 €

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.