Maison Java JavaBase Introduction à plusieurs erreurs courantes en Java

Introduction à plusieurs erreurs courantes en Java

Dec 23, 2019 pm 03:43 PM
java

Introduction à plusieurs erreurs courantes en Java

Erreurs Java courantes :

1. Erreur de pointeur nul

Dans l'utilisation de tableaux Java, il est parfois nécessaire de modifier les éléments du tableau de chaînes Faire des comparaisons. Ensuite, lorsque l'élément n'est pas nul, le programme s'exécutera normalement ; cependant, une fois que l'élément comparé est nul, une erreur de pointeur nul se produira dans le programme.

Solution : Ajoutez une protection et portez un jugement lorsque l'élément n'est pas nul.

public static void main(Sring[] args){
  String [] sums = "adfafA";
  for(int i=0;i<sums.length;i++){
    if(sums[]!=null && sums[i].equals(sr)){
      System.out.println("找到元素"+sums[i]);
      break;
    }
  }
}
Copier après la connexion

2. Plage de précision des données et conversion de type

Il existe 4 types de données de base en Java :

Type entier : -1 2 3 4…

Type à virgule flottante : float 1.3f ; double 3.2 3.5d (type non spécifié, précision la plus élevée par défaut)

Type de caractère : encodage Unicode, 2 octets

Type booléen : les plages de précision du quatre types de données de base, vrais et faux

, sont différents et sont améliorés étape par étape.

Si vous ne faites pas attention à la plage de précision lors de l'utilisation des types de données, un débordement de données se produira, entraînant des erreurs de calcul.

Parmi les quatre types de base, les données entières, à virgule flottante et caractères peuvent être converties entre elles.

Les règles de conversion sont les suivantes :

①Conversion invisible : les valeurs de données avec une petite précision sont affectées à des valeurs avec une haute précision et peuvent être automatiquement converties. (De bas niveau à haut niveau)

②Conversion forcée : valeurs de données avec une large plage, (de haut niveau à bas niveau)

③Règles de promotion automatique de fonctionnement : pendant le fonctionnement, il est automatiquement converti en un type de données de haute précision.

3. L'utilisation de trois types de boucles

① pour la boucle : C'est une boucle avec un nombre de fois limité. Avant la boucle, le nombre de boucles est précisé.

for(表达式;表达式;表达式){
        循环体
 }
Copier après la connexion

instruction break : après l'exécution, sortez immédiatement de la boucle, n'exécutez pas les instructions suivantes et terminez toutes les boucles.

instruction continue : après l'exécution, sortez immédiatement de la boucle de mots actuelle et jugez à nouveau si la condition continue de boucler.

②Instruction de boucle While : convient aux boucles d'un nombre de fois inconnu.

while(条件表达式){
  语句
 };
Copier après la connexion

③do-While loop : C'est aussi une boucle d'un nombre de fois inconnu. L'ordonnance doit être exécutée au moins une fois avant de rendre un jugement. Si while est vrai, continuez la boucle, sinon terminez la boucle.

do {
 语句
 }while(条件表达式);
Copier après la connexion

4. Copier la chaîne plusieurs fois

Une erreur qui ne peut pas être trouvée par les tests génère plusieurs copies d'un objet immuable. Un objet immuable ne peut pas être modifié, il n'est donc pas nécessaire de le copier. L’objet immuable le plus couramment utilisé est String.

Si vous devez modifier le contenu d'un objet String, vous devez utiliser StringBuffer. Le code suivant fonctionnera correctement :

String s = new String ("Text here");
Copier après la connexion

Cependant, ce code a de mauvaises performances et est inutilement complexe. Vous pouvez également réécrire le code ci-dessus de la manière suivante :

String temp = "Text here";
String s = new String (temp);
Copier après la connexion

Mais ce code contient une chaîne supplémentaire, ce qui n'est pas complètement nécessaire. Le meilleur code est :

String s = "Text here";
Copier après la connexion

5. Aucun objet n'est renvoyé par clone (clone)

L'encapsulation est un concept important dans la programmation orientée objet. Malheureusement, Java facilite la rupture accidentelle de l'encapsulation - Java permet de renvoyer des références à des données privées. Le code suivant révèle ceci :

import java.awt.Dimension;
  /***Example class.The x and y values should never*be negative.*/
  public class Example{
  private Dimension d = new Dimension (0, 0);
  public Example (){ }
  /*** Set height and width. Both height and width must be nonnegative * or an exception is thrown.*/
  public synchronized void setValues (int height,int width) throws IllegalArgumentException{
  if (height <0 || width <0)
  throw new IllegalArgumentException();
  d.height = height;
  d.width = width;
  }
  public synchronized Dimension getValues(){
  // Ooops! Breaks encapsulation
  return d;
  }
  }
Copier après la connexion

La classe Exemple garantit que les valeurs de hauteur et de largeur qu'elle stocke sont toujours non négatives. Essayer d'utiliser la méthode setValues() pour définir des valeurs négatives déclenchera un message. exception. Malheureusement, puisque getValues() renvoie une référence à d, pas une copie de d, vous pouvez écrire du code destructeur comme celui-ci :

  Example ex = new Example();
  Dimension d = ex.getValues();
  d.height = -5;
  d.width = -10;
Copier après la connexion

Maintenant, l'objet Exemple a une valeur négative si l'appel à getValues() ! Si l'utilisateur ne définit jamais les valeurs de largeur et de hauteur de l'objet Dimension renvoyé, il est impossible de détecter de telles erreurs par des tests seuls.

Malheureusement, au fil du temps, le code client peut modifier la valeur de l'objet Dimension renvoyé. À l'heure actuelle, retrouver la source de l'erreur est fastidieux et prend du temps, en particulier dans un environnement multithread.

Une meilleure façon est de laisser getValues() renvoyer une copie :

  public synchronized Dimension getValues(){
  return new Dimension (d.x, d.y);
  }
Copier après la connexion

6 Copie de mauvaises données

Parfois, les programmeurs savent qu'ils doivent renvoyer une copie, mais ne le font pas. t Faites attention à ne pas copier les mauvaises données. Puisque seule une partie du travail de copie des données est effectuée, le code suivant s'écarte de l'intention du programmeur :

import java.awt.Dimension;
  /*** Example class. The height and width values should never * be
  negative. */
  public class Example{
  static final public int TOTAL_VALUES = 10;
  private Dimension[] d = new Dimension[TOTAL_VALUES];
  public Example (){ }
  /*** Set height and width. Both height and width must be nonnegative * or an exception will be thrown. */
  public synchronized void setValues (int index, int height, int width) throws IllegalArgumentException{
  if (height <0 || width <0)
  throw new IllegalArgumentException();
  if (d[index] == null)
  d[index] = new Dimension();
  d[index].height = height;
  d[index].width = width;
  }
  public synchronized Dimension[] getValues()
  throws CloneNotSupportedException{
  return (Dimension[])d.clone();
  }
  }
Copier après la connexion

Le problème ici est que la méthode getValues() clone uniquement le tableau, mais ne clone pas l'objet Dimension contenu Dans le tableau,Par conséquent, bien que l'appelant ne puisse pas modifier le tableau interne afin que ses éléments pointent vers différents objets Dimension, l'appelant peut modifier le contenu des éléments du tableau interne (c'est-à-dire l'objet Dimension). Une meilleure version de la méthode getValues() est :

 public synchronized Dimension[] getValues() throws CloneNotSupportedException{
  Dimension[] copy = (Dimension[])d.clone();
  for (int i = 0; i
  // NOTE: Dimension isn’t cloneable.
  if (d != null)
  copy[i] = new Dimension (d[i].height, d[i].width);
  }
  return copy;
  }
Copier après la connexion

Des erreurs similaires seront commises lors du clonage de tableaux multidimensionnels de données de type atomique. Les types atomiques incluent int, float, etc. Un simple clone d'un tableau unidimensionnel de type int est correct, comme indiqué ci-dessous :

 public void store (int[] data) throws CloneNotSupportedException{
  this.data = (int[])data.clone();
  // OK
  }
Copier après la connexion

Copier un tableau bidimensionnel de type int est plus compliqué. Java n'a pas de tableau bidimensionnel de type int, donc un tableau bidimensionnel de type int est en fait un tableau unidimensionnel : son type est int[]. Le simple clonage d'un tableau de type int[][] fera la même erreur que la première version de la méthode getValues() dans l'exemple ci-dessus, cela doit donc être évité. L'exemple suivant montre les méthodes incorrectes et correctes lors du clonage d'un tableau int bidimensionnel :

public void wrongStore (int[][] data) throws CloneNotSupportedException{
  this.data = (int[][])data.clone(); // Not OK!
  }
  public void rightStore (int[][] data){
  // OK!
  this.data = (int[][])data.clone();
  for (int i = 0; i
  if (data != null)
  this.data[i] = (int[])data[i].clone();
  }
  }
Copier après la connexion

Pour plus de connaissances sur Java, veuillez faire attention à la colonne Tutoriel de base Java.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Commandes de chat et comment les utiliser
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Nombre parfait en Java Nombre parfait en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre parfait en Java. Nous discutons ici de la définition, comment vérifier le nombre parfait en Java ?, des exemples d'implémentation de code.

Générateur de nombres aléatoires en Java Générateur de nombres aléatoires en Java Aug 30, 2024 pm 04:27 PM

Guide du générateur de nombres aléatoires en Java. Nous discutons ici des fonctions en Java avec des exemples et de deux générateurs différents avec d'autres exemples.

Weka en Java Weka en Java Aug 30, 2024 pm 04:28 PM

Guide de Weka en Java. Nous discutons ici de l'introduction, de la façon d'utiliser Weka Java, du type de plate-forme et des avantages avec des exemples.

Numéro de Smith en Java Numéro de Smith en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre de Smith en Java. Nous discutons ici de la définition, comment vérifier le numéro Smith en Java ? exemple avec implémentation de code.

Questions d'entretien chez Java Spring Questions d'entretien chez Java Spring Aug 30, 2024 pm 04:29 PM

Dans cet article, nous avons conservé les questions d'entretien Java Spring les plus posées avec leurs réponses détaillées. Pour que vous puissiez réussir l'interview.

Break or Return of Java 8 Stream Forach? Break or Return of Java 8 Stream Forach? Feb 07, 2025 pm 12:09 PM

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

Horodatage à ce jour en Java Horodatage à ce jour en Java Aug 30, 2024 pm 04:28 PM

Guide de TimeStamp to Date en Java. Ici, nous discutons également de l'introduction et de la façon de convertir l'horodatage en date en Java avec des exemples.

Programme Java pour trouver le volume de la capsule Programme Java pour trouver le volume de la capsule Feb 07, 2025 am 11:37 AM

Les capsules sont des figures géométriques tridimensionnelles, composées d'un cylindre et d'un hémisphère aux deux extrémités. Le volume de la capsule peut être calculé en ajoutant le volume du cylindre et le volume de l'hémisphère aux deux extrémités. Ce tutoriel discutera de la façon de calculer le volume d'une capsule donnée en Java en utilisant différentes méthodes. Formule de volume de capsule La formule du volume de la capsule est la suivante: Volume de capsule = volume cylindrique volume de deux hémisphères volume dans, R: Le rayon de l'hémisphère. H: La hauteur du cylindre (à l'exclusion de l'hémisphère). Exemple 1 entrer Rayon = 5 unités Hauteur = 10 unités Sortir Volume = 1570,8 unités cubes expliquer Calculer le volume à l'aide de la formule: Volume = π × r2 × h (4

See all articles